package pe.gob.osce.sirenas.svc;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import pe.gob.osce.sirenas.dao.AcreditacionDAOLocal;
import pe.gob.osce.sirenas.dao.FichaArbitralDAOLocal;
import pe.gob.osce.sirenas.dao.FormacionAcademicaDAOLocal;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.FichaArbitralDTO;
import pe.gob.osce.sirenas.model.FormacionAcademicaDTO;
import pe.gob.osce.sirenas.model.reporte.DataReporteDTO;
import pe.gob.osce.sirenas.model.reporte.FiltroReporteDTO;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;

@Stateless(mappedName = "ObtenerReportesService")
public class ObtenerReportesServiceImpl implements ObtenerReportesServiceLocal{
	final static Logger log = Logger.getLogger(ObtenerDatosComunesServiceImpl.class);

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@EJB
	private FichaArbitralDAOLocal fichaArbitralDAOLocal;
	@EJB
	private AcreditacionDAOLocal acreditacionDAOLocal;
	@EJB
	private FormacionAcademicaDAOLocal formacionAcademicaDAOLocal;
	
	@Override
	public List<DataReporteDTO> obtenerReporteConsolidado(FiltroReporteDTO filtroReporteDTO) throws Exception{
		List<DataReporteDTO> listaDataConsolidadaDTO=new ArrayList<DataReporteDTO>();
		List<DataReporteDTO> listaDataDetalladaDTO=new ArrayList<DataReporteDTO>();
		try{
			List<FichaArbitralDTO> listaFichasReporte=fichaArbitralDAOLocal.obtenerReporteCabecera(filtroReporteDTO);
			DataReporteDTO datoReporteDTO;
			for (FichaArbitralDTO fichaArbitralDTO : listaFichasReporte) {
				datoReporteDTO=new DataReporteDTO();
				datoReporteDTO.setApMaterno(fichaArbitralDTO.getPersona().getApMaterno() );
				datoReporteDTO.setApPaterno(fichaArbitralDTO.getPersona().getApPaterno() );
				datoReporteDTO.setNombres(fichaArbitralDTO.getPersona().getNombres() );
				datoReporteDTO.setFecNacimiento(fichaArbitralDTO.getPersona().getFecNacimiento() );
				datoReporteDTO.setEdad(calcularEdad(datoReporteDTO.getFecNacimiento() ));
				datoReporteDTO.setIndTipoDocumento(fichaArbitralDTO.getPersona().getIndTipoDocumento());
				datoReporteDTO.setNumDocumento(fichaArbitralDTO.getPersona().getNumDocumento() );
				datoReporteDTO.setNumRuc(fichaArbitralDTO.getPersona().getNumRuc() );
				
				datoReporteDTO.setNumFicha(fichaArbitralDTO.getNumFicha() );				
				datoReporteDTO.setIndModalidadArbitro(fichaArbitralDTO.getIndModalidadArbitro() );
				datoReporteDTO.setModalidadArbitro(fichaArbitralDTO.getModalidadArbitro() );
				datoReporteDTO.setFechaModalidad(fichaArbitralDTO.getFechaModalidad() );
				
				List<AcreditacionDTO> listaAcreditaciones=acreditacionDAOLocal.obtenerReporteAcreditaciones(fichaArbitralDTO.getIdFicha(), filtroReporteDTO.getEspecialidades());
				datoReporteDTO.setCantidadAcreditaciones(listaAcreditaciones.size() );
				if(filtroReporteDTO.getEspecialidades().size()>0 && listaAcreditaciones.size()==0)
					continue;
				
				List<FormacionAcademicaDTO> listaFormAcademica=formacionAcademicaDAOLocal.obtenerReporteFormacionAcademica(fichaArbitralDTO.getIdFicha(), filtroReporteDTO);
				datoReporteDTO.setCantidadFormacion(listaFormAcademica.size() );
				if(filtroReporteDTO.getIndGradoObtenido()>0 && listaFormAcademica.size()==0)
					continue;
				if(filtroReporteDTO.getIdAreaProfesion()>0 && listaFormAcademica.size()==0)
					continue;
				
				listaDataConsolidadaDTO.add(datoReporteDTO);
			}

		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
		return listaDataConsolidadaDTO;
	}
	
	public Integer calcularEdad(Date nacimiento){
		
		Calendar dob = Calendar.getInstance();
		dob.setTime(nacimiento);
		Calendar today = Calendar.getInstance();
		Integer age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
		if (today.get(Calendar.DAY_OF_YEAR) <= dob.get(Calendar.DAY_OF_YEAR))
		age--;
		return age;
	}	
}
